package com.wqm;

import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.builder.ConfigBuilder;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.engine.AbstractTemplateEngine;
import com.baomidou.mybatisplus.generator.engine.VelocityTemplateEngine;
import lombok.AccessLevel;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * @author: wangqinmin
 * @date : 2020/10/24
 * @description: 仰天大笑出门去，我辈岂是蓬蒿人
 */
@Data
@Accessors(chain = true)
public class AutoGeneratorProxy extends AutoGenerator implements Config {

    private static final Logger logger = LoggerFactory.getLogger(AutoGeneratorProxy.class);


    /**
     * 配置信息
     */
    protected ConfigBuilder config;
    /**
     * 注入配置
     */
    @Getter(AccessLevel.NONE)
    @Setter(AccessLevel.NONE)
    protected InjectionConfig injectionConfig;
    /**
     * 数据源配置
     */
    private DataSourceConfig dataSource;
    /**
     * 数据库表配置
     */
    private StrategyConfig strategy;
    /**
     * 包 相关配置
     */
    private PackageConfig packageInfo;
    /**
     * 模板 相关配置
     */
    private TemplateConfig template;
    /**
     * 全局 相关配置
     */
    private GlobalConfig globalConfig;
    /**
     * 模板引擎
     */
    private AbstractTemplateEngine templateEngine;

    /**
     * 新增表信息存储字段
     */
    private List<TableInfo> tableInfoList;

    /**
     * 代码生成执行器（静态代理AutoGenerator类）
     */
    @Override
    public void execute() {

        logger.debug("==========================准备生成文件...==========================");
        // 初始化配置
        if (null == config) {
            config = new ConfigBuilder(packageInfo, dataSource, strategy, template, globalConfig);
            if (null != injectionConfig) {
                injectionConfig.setConfig(config);
            }
        }
        if (null == templateEngine) {
            // 为了兼容之前逻辑，采用 Velocity 引擎 【 默认 】
            templateEngine = new VelocityTemplateEngine();
        }



        // 修改表信息（去除配置过的表名前缀）
        updateTableInfo();

        // 模板引擎初始化执行文件输出
        ConfigBuilder configBuilder = this.pretreatmentConfigBuilder(config);

        List<TableInfo> tableInfoList1 = configBuilder.getTableInfoList();
//        List<TableInfo> tableInfoList1 = config.getTableInfoList();
        tableInfoList1.forEach(o -> {
            o.setServiceName(o.getServiceName().substring(1,o.getServiceName().length()));
        });

        AbstractTemplateEngine init = templateEngine.init(configBuilder);
        init.mkdirs();
        init.batchOutput();
        init.open();
        logger.debug("==========================文件生成完成！！！==========================");
    }

    /**
     * 修改表信息（去除表名前缀）
     */
    private void updateTableInfo() {
        // 根据配置规则，修改去除表前缀，并生成类名
        if (DATABASE_REMOVE_PREFIX.length != 0) {
            // 修改配置中的表信息，另外存储，并赋值
            List<TableInfo> newTableInfoList = new ArrayList<>();
            // 获取配置中，所有的表信息
            List<TableInfo> tableInfoList = this.config.getTableInfoList();
            for (TableInfo tableInfo : tableInfoList) {
                TableInfo newTableInfo = new TableInfo();
                // 修改后的表名
                String tableName = CodeGenerator2020.standardEntityName(tableInfo.getName());
                // 修改后的驼峰格式的实体类名
                String underlineToPascalName = CodeGenerator2020.underlineToPascal(tableName);
                // 开始赋值
                newTableInfo.setName(tableInfo.getName());
                newTableInfo.setEntityName(underlineToPascalName + PACKAGE_ENTITY[1]);
                newTableInfo.setMapperName(underlineToPascalName + PACKAGE_MAPPER[1]);
                newTableInfo.setXmlName(underlineToPascalName + PACKAGE_MAPPER[1]);
                newTableInfo.setServiceName("I" + underlineToPascalName + PACKAGE_SERVICE[1]);
                newTableInfo.setServiceImplName(underlineToPascalName + PACKAGE_SERVICE_IMPL[1]);
                newTableInfo.setControllerName(underlineToPascalName + PACKAGE_CONTROLLER[1]);
                newTableInfo.setComment(tableInfo.getComment());
                newTableInfo.setFields(tableInfo.getFields());
                newTableInfo.setHavePrimaryKey(tableInfo.isHavePrimaryKey());
                newTableInfo.setCommonFields(tableInfo.getCommonFields());
                newTableInfo.setFieldNames(tableInfo.getFieldNames());
                newTableInfo.setConvert(tableInfo.isConvert());
                // 向newTableInfoList赋值
                newTableInfoList.add(newTableInfo);
            }
            config.setTableInfoList(newTableInfoList);
        }
    }



}
